/*add GeocodeJSONParser*/

package jsonparser;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

public class GeocodeJSONParser {
	/** Receives a JSONObject and returns a list */
	public List<HashMap<String, String>> parse(JSONObject jObject) {

		JSONArray jPlaces = null;
		try {
			/** Retrieves all the elements in the 'places' array */
			jPlaces = jObject.getJSONArray("results");
		} catch (JSONException e) {
			e.printStackTrace();
		}
		/**
		 * Invoking getPlaces with the array of json object where each json
		 * object represent a place
		 */
		return getPlaces(jPlaces);
	}

	private List<HashMap<String, String>> getPlaces(JSONArray jPlaces) {
		int placesCount = jPlaces.length();
		List<HashMap<String, String>> placesList = new ArrayList<HashMap<String, String>>();
		HashMap<String, String> place = null;

		/** Taking each place, parses and adds to list object */
		for (int i = 0; i < placesCount; i++) {
			try {
				/** Call getPlace with place JSON object to parse the place */
				place = getPlace((JSONObject) jPlaces.get(i));
				placesList.add(place);

			} catch (JSONException e) {
				e.printStackTrace();
			}
		}

		return placesList;
	}

	/** Parsing the Place JSON object */
	private HashMap<String, String> getPlace(JSONObject jPlace) {

		HashMap<String, String> place = new HashMap<String, String>();
		String formatted_address = "-NA-";
		String lat = "";
		String lng = "";

		try {
			// Extracting formatted address, if available
			if (!jPlace.isNull("formatted_address")) {
				formatted_address = jPlace.getString("formatted_address");
			}
			lat = jPlace.getJSONObject("geometry").getJSONObject("location")
					.getString("lat");
			lng = jPlace.getJSONObject("geometry").getJSONObject("location")
					.getString("lng");

			place.put("formatted_address", formatted_address);
			place.put("lat", lat);
			place.put("lng", lng);

		} catch (JSONException e) {
			e.printStackTrace();
		}
		return place;
	}
}
